package com.aliyun.messagemgt.repository.mappers;

import com.aliyun.messagemgt.common.dto.send.MsgRecordVO;
import com.aliyun.messagemgt.common.dto.send.Receiver;
import com.aliyun.messagemgt.dto.MsgHandleLog;
import com.aliyun.messagemgt.dto.query.MsgHandleLogQuery;
import com.aliyun.messagemgt.dto.vo.MsgHandleLogResultVO;
import com.aliyun.messagemgt.dto.vo.SmsTrendResultVO;
import com.aliyun.messagemgt.entities.MsgHandleLogEntity;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDate;
import java.util.Date;
import java.util.List;

/**
 * @Author Znight
 * @Date 16:08 2019/5/7
 */
public interface MsgHandleLogMapper {

    /**
     * 查询推送失败数量
     *
     * @param msgId
     * @return
     */
    int queryPushResult(@Param("msgId") Long msgId);

    /**
     * 查询消息处理记录表3个月前数据
     *
     * @param historyDay
     * @param pageNum
     * @param pageSize
     * @return
     */
    List<MsgHandleLogEntity> queryHistoryMsg(@Param("historyDay") LocalDate historyDay, @Param("pageNum") int pageNum, @Param("pageSize") int pageSize);

    /**
     * 查询消息处理记录表3个月前数据
     *
     * @param historyDay
     * @param pageNum
     * @param pageSize
     * @return
     */
    List<MsgHandleLogEntity> queryDevHistoryMsg(@Param("historyDay") LocalDate historyDay, @Param("sourceName") String sourceName, @Param("pageNum") int pageNum, @Param("pageSize") int pageSize);

    /**
     * 删除消息处理记录表中数据
     *
     * @param msgHandleLogs
     * @return
     */
    int deleteHistoryMsg(@Param("msgHandleLogs") List<MsgHandleLog> msgHandleLogs);

    /**
     * 更新用户是否已读消息
     *
     * @param msgHandleLogQuery
     * @return
     */
    int updateStateRead(@Param("msgHandleLogQuery") MsgHandleLogQuery msgHandleLogQuery);

    /**
     * 查询短信概览统计（以天为维度）
     *
     * @param msgSourceId 消息源
     * @param beginDate   开始时间 yyyy-MM-dd
     * @param endDate     结束时间 yyyy-MM-dd
     * @param tempEndDate 临时表结束时间 yyyy-MM-dd
     * @return map
     */
    List<SmsTrendResultVO.SmsTrend> queryDayTrend(@Param("msgSourceId") String msgSourceId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("tempEndDate") String tempEndDate);

    /**
     * 查询短信概览统计（以月度为维度）
     *
     * @param msgSourceId 消息源
     * @param beginDate   开始时间 yyyy-MM
     * @param endDate     结束时间 yyyy-MM
     * @param monthLimit  limit 值
     * @return map
     */
    List<SmsTrendResultVO.SmsTrend> queryMonthTrend(@Param("msgSourceId") String msgSourceId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("monthLimit") Integer monthLimit);

    /**
     * 批量插入
     *
     * @param msgRecordVos
     * @return
     */
    int batchMsgHandleLogInsert(@Param("msgRecordVOs") List<MsgRecordVO> msgRecordVos);

    /**
     * 根据消息源id 及时间范围查询 操作失败的日志
     *
     * @param msgSourceId 消息源id
     * @param beginTime   开始时间
     * @param endTime     结束时间
     * @return 失败的操作日志结果集
     */
    List<MsgHandleLogResultVO> queryErrorMsgHandleLogsBySourceId(@Param("msgSourceId") String msgSourceId, @Param("beginTime") Date beginTime, @Param("endTime") Date endTime);

    /**
     * 根据渠道id 查询操作失败的日志
     * @param channelId 渠道id
     * @param beginTime 开始时间
     * @param endTime   结束时间
     * @return list
     */
    List<MsgHandleLogResultVO> queryErrorMsgHandleLogsByChannelName(@Param("channelId") Integer channelId, @Param("beginTime") Date beginTime, @Param("endTime") Date endTime);

    /**
     * 根据渠道类型 查询操作失败的日志
     * @param channelType 渠道类型
     * @param beginTime 开始时间
     * @param endTime   结束时间
     * @return list
     */
    List<MsgHandleLogResultVO> queryErrorMsgHandleLogsByChannelType(@Param("channelType") Integer channelType, @Param("beginTime") Date beginTime, @Param("endTime") Date endTime);

    List<MsgHandleLogEntity> queryByMsgIdList(@Param("msgIdList") List<Long> msgIdList);

    List<MsgHandleLogEntity> queryFailedByMsgId(@Param("msgId")Long msgId);

    int updateByMsgId(@Param("msgHandleLog")MsgHandleLog msgHandleLog);

    void updatePushResult(@Param("msgHandleLog")MsgHandleLog msgHandleLog, @Param("receiverList")List<Receiver> receiverList);
}
